﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using TheOutLetLibrary.Dominio;

namespace TheOutLetLibrary.Infraestrutura {

    public class AccessRemessaDAO: IRemessaDAO {

        private OleDbTransaction transacao;

        public AccessRemessaDAO(OleDbTransaction transacao) {
            this.transacao = transacao;
        }

        public int BuscarProximaIdRemessa() {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = transacao.Connection;
            comando.Transaction = transacao;
            comando.CommandText = "SELECT MAX(XID_REMESSA) FROM tb_remessa";
            OleDbDataReader reader = comando.ExecuteReader();
            reader.Read();
            if(reader.GetValue(0) != DBNull.Value) {
                int ultimaRemessa = Convert.ToInt32(reader.GetValue(0));
                return ultimaRemessa++;
            } else {
                return 1;
            }
        }

        public int Incluir(Remessa remessa) {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = transacao.Connection;
            comando.Transaction = transacao;
            comando.CommandText =
                "INSERT INTO tb_remessa (xID_EMPRESA, DT_RECEBIMENTO_REMESSA) " +
                " VALUES (@xID_EMPRESA, @DT_RECEBIMENTO_REMESSA);";
            comando.Parameters.Add("xID_EMPRESA", OleDbType.Integer).Value = remessa.XID_EMPRESA;
            comando.Parameters.Add("DT_RECEBIMENTO_REMESSA", OleDbType.Date).Value = remessa.DT_RECEBIMENTO_REMESSA;
            comando.ExecuteNonQuery();
            comando.CommandText = "SELECT @@IDENTITY";
            return Convert.ToInt32(comando.ExecuteScalar());
        }

        public void Alterar(Remessa remessa) {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = transacao.Connection;
            comando.Transaction = transacao;
            comando.CommandText = 
                " UPDATE tb_remessa set DT_RECEBIMENTO_REMESSA = @DT_RECEBIMENTO_REMESSA " +
                " WHERE xID_REMESSA = @xID_REMESSA";
            comando.Parameters.Add("@xID_REMESSA", OleDbType.Integer).Value = remessa.XID_REMESSA;
            comando.Parameters.Add("@DT_RECEBIMENTO", OleDbType.Date).Value = remessa.DT_RECEBIMENTO_REMESSA;
            comando.ExecuteNonQuery();
        }

        public OleDbDataReader CarregarRemessas() {
            OleDbCommand comando = new OleDbCommand(
                " select r.*, e.nmc_empresa " +
                " from tb_remessa r, tb_empresa e " +
                " where r.xid_empresa = e.xid_empresa" +
                " order by r.xid_remessa desc");
            comando.Connection = transacao.Connection;
            comando.Transaction = transacao;
            return comando.ExecuteReader();
        }

        public Remessa Buscar(int idRemessa) {
            OleDbCommand comando = new OleDbCommand(
                "select * from tb_remessa where xid_remessa = @xid_remessa",
                transacao.Connection);
            comando.Transaction = transacao;
            comando.Parameters.Add("@xid_remessa", OleDbType.Integer).Value = idRemessa;
            Remessa remessa = new Remessa();
            OleDbDataReader reader = comando.ExecuteReader();
            reader.Read();
            if(reader.HasRows) {
                remessa.DT_RECEBIMENTO_REMESSA = (DateTime)reader.GetValue(reader.GetOrdinal("DT_RECEBIMENTO_REMESSA"));
                remessa.XID_EMPRESA = (Int32)reader.GetValue(reader.GetOrdinal("xID_EMPRESA"));
                remessa.XID_REMESSA = idRemessa;
            }
            return remessa;
        }
    }
}
